<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Commercial extends CI_Controller {

    public function __construct() {
        parent::__construct();
        if (!isset($this->session->userdata['utilisateur_id']))
            exit('No direct script access allowed');
    }

    public function index() {
        page('Commerce/index', 'Commerce', null);
    }

    public function Clients() {

        $crud = new grocery_CRUD();

        $crud->set_table('t_societe')
                ->set_subject('un client')
                ->columns('societe_raison_sociale', 'societe_tel', 'societe_email', 'societe_actif')
                ->set_relation_n_n('contact', 'a_contacter', 't_utilisateur', 'societe_id', 'utilisateur_id', 'utilisateur_nom_entier')
                // ,'utilisateur_id'
                ->set_relation('societe_type_id', 't_societe_type', 'societe_type_libelle')
                ->callback_column('societe_actif', array($this, 'Image_actif'))
                ->display_as('societe_raison_sociale', 'Raison Sociale')
                ->display_as('societe_adresse', 'Adresse')
                ->display_as('societe_cp', 'Code Postal')
                ->display_as('societe_pays', 'Pays')
                ->display_as('societe_actif', 'Actif')
                ->display_as('societe_type_id', 'Type')
                ->fields('societe_type_id', 'contact', 'societe_raison_sociale', 'societe_adresse', 'societe_adresse_compl', 'societe_cp', 'societe_pays', 'societe_tel', 'societe_fax', 'societe_numero_siret', 'societe_code_ape', 'societe_capital', 'societe_tva', 'societe_email', 'societe_site', 'societe_actif')
                ->required_fields('societe_type_id', 'societe_raison_sociale', 'societe_adresse', 'societe_cp', 'societe_pays');

        $crud->where('t_societe.societe_type_id', '3');
        $crud->order_by('t_societe.societe_raison_sociale', 'ASC');

        $output = $crud->render();
        // print_r($output);
        page('Crud/crud', 'Gestion des Clients', $output);
    }

    public function Produits() {
        $crud = new grocery_CRUD();

        $crud->set_table('t_produit')
                ->set_subject('un produit')
                ->columns('prod_type_id', 'produit_libelle', 'produit_code', 'produit_prix')
                ->set_relation_n_n('nomenclature', 'a_nomenclature', 't_produit', 't_p_produit_id', 'produit_id', 'produit_libelle', 'nomenclature_quantite')
                ->set_relation('tva_id', 't_tva', 'tva_taux')
                ->set_relation('prod_type_id', 't_prod_type', 'prod_type_libelle')
                ->callback_column('produit_actif', array($this, 'Image_actif'))
                ->display_as('tva_id', 'TVA (%)')
                ->display_as('prod_type_id', 'Famille')
                ->display_as('produit_libelle', 'Nom')
                ->display_as('produit_quantite_commande', 'Quantité (U)')
                ->display_as('produit_temps', 'Temps (H)')
                ->display_as('produit_prix', 'Prix (€)')
                ->fields('prod_type_id', 'produit_libelle', 'produit_code', 'nomenclature', 'tva_id', 'produit_quantite_commande', 'produit_temps', 'produit_prix')
                ->callback_field('prod_type_id', array($this, 'DisabledCombo'))
                ->callback_field('produit_libelle', array($this, 'DisabledField'))
                ->callback_field('produit_code', array($this, 'DisabledField'))
                ->callback_field('tva_id', array($this, 'DisabledField'))
                ->callback_field('produit_prix', array($this, 'DisabledField'))
                ->unset_add()
                ->required_fields('produit_quantite_commande');

        $crud->order_by('t_produit.produit_libelle', 'ASC');

        $output = $crud->render();

        page('Crud/crud', 'Gestion des Produits', $output);
        //print_r($output);
    }

    public function DetailsCommande($idCmd) {
        $crud = new grocery_CRUD();

        $crud->set_table('a_commande_ligne')
                ->set_subject('un produit')
                ->columns('produit_id', 'commande_ligne_qte', 'commande_ligne_prix')
                ->fields('produit_id', 'commande_ligne_qte')
                ->required_fields('produit_id', 'commande_ligne_qte')
                ->change_field_type('idCmd', 'hidden', $idCmd)

                // Affichage.
                ->display_as('commande_ligne_prix', 'total')
                ->display_as('commande_ligne_qte', 'quantité')
                ->display_as('produit_id', 'produit')

                // Relations.
                ->set_relation('produit_id', 't_produit', 'produit_libelle')
        ;

        // Callbacks.
        $crud->callback_insert(array($this, 'callbackInsertCommandeDetail'));
        $crud->callback_update(array($this, 'callbackUpdateCommandeDetail'));

        $crud->order_by('produit_libelle', 'ASC');
        $crud->where('commande_id', $idCmd);

        $output = $crud->render();

        page('Commerce/crud', 'Détail d\'une commande', $output);
    }

    public function test() {
        $post = array(
            'produit_id' => 3,
            'idCmd' => 2,
            'commande_ligne_qte' => 10
        );

        $this->callbackInsertCommandeDetail($post, 5);
    }

    public function callbackUpdateCommandeDetail($post, $id = null) {

        // Si on change le produit...
        if ($id !== $post['produit_id']) {
            // On regarde si ce produit est déjà dans ce devis.
            $qtity = $this->db->select('commande_ligne_qte')->from('a_commande_ligne')->where('produit_id', $post['produit_id'])->where('commande_id', $post['idCmd'])->get()->result();
            if (isset($qtity[0]))
                $this->db->where('produit_id', $id)->where('commande_id', $post['idCmd'])->delete('a_commande_ligne');
        }

        $qtity = $post['commande_ligne_qte'];

        // Calcul du prix.
        $price = $this->db->select('produit_prix')->from('t_produit')->where('produit_id', $post['produit_id'])->get()->result();
        $price = $price[0]->produit_prix;
        $price = $price * $qtity;

        $toUpdate = array(
            'commande_ligne_qte' => $qtity,
            'commande_ligne_prix' => $price
        );

        $this->db->where('produit_id', $post['produit_id'])->where('commande_id', $post['idCmd'])->update('a_commande_ligne', $toUpdate);
    }

    public function callbackInsertCommandeDetail($post) {
        // On regarde si ce produit est déjà dans ce devis.
        $qtity = $this->db->select('commande_ligne_qte')->from('a_commande_ligne')->where('produit_id', $post['produit_id'])->where('commande_id', $post['idCmd'])->get()->result();
        $exist = false;
        if (isset($qtity[0])) {
            $exist = true;
            $qtity = $qtity[0]->commande_ligne_qte + $post['commande_ligne_qte'];
        }
        else
            $qtity = $post['commande_ligne_qte'];

        // Calcul du prix.
        $price = $this->db->select('produit_prix')->from('t_produit')->where('produit_id', $post['produit_id'])->get()->result();
        $price = $price[0]->produit_prix;
        $price = $price * $qtity;

        // Si le produit existe déjà
        if ($exist) {
            $toUpdate = array(
                'commande_ligne_qte' => $qtity,
                'commande_ligne_prix' => $price
            );

            $this->db->where('produit_id', $post['produit_id'])->where('commande_id', $post['idCmd'])->update('a_commande_ligne', $toUpdate);
        }

        // Si le produit n'est pas encore dans le devis.
        else {
            $toInsert = array(
                'produit_id' => $post['produit_id'],
                'commande_id' => $post['idCmd'],
                'commande_ligne_qte' => $qtity,
                'commande_ligne_prix' => $price
            );

            $this->db->insert('a_commande_ligne', $toInsert);
        }
    }

    public function Commandes() {

        $crud = new grocery_CRUD();

        $crud->set_table('t_commande')
                ->set_subject('Commande')
                ->columns('commande_statut_id', 'commande_ref', 'commande_ref_client', 'commande_date_creation')
                ->fields('commande_statut_id', 'commande_ref', 'commande_ref_client', 'commande_date_creation', 'etat_id', 'histo_soc_id', 'utilisateur_id', 'commande_date_debut', 'commande_date_fin', 'commande_commentaire')
                ->required_fields('commande_statut_id', 'utilisateur_id', 'commande_date_creation', 'societe_type_id', 'etat_id', 'commande_date_debut')

                // Affichage.
                ->display_as('histo_soc_id', 'Client')
                ->display_as('commande_ref', 'N° Commande')
                ->display_as('commande_date_creation', 'Date de création')
                ->display_as('commande_ref_client', 'Référence client')
                ->display_as('commande_statut_id', 'Statut')
                ->display_as('etat_id', 'Etat')
                ->display_as('utilisateur_id', 'Contact')
                
                // Relations.
                ->set_relation('utilisateur_id', 't_utilisateur', 'utilisateur_nom_entier')
                ->set_relation('histo_soc_id', 't_histo_societe', 'histo_soc_raison_sociale')
                ->set_relation('commande_statut_id', 't_commande_statut', 'commande_statut_libelle')
                ->set_relation('etat_id', 't_etat', 'etat_libelle')
                
                ->change_field_type('commande_commentaire', 'text')
                ->change_field_type('histo_soc_id', 'hidden')
                ;

        // Function qui insére les Qté et prix de chaque produits dans "commande_ligne".
//        $crud->callback_after_insert(array($this, 'commande_after_insert'));


        $crud->add_action('PDF', site_url('assets/img/savePdf.gif'), 'pdfPrinterCommande/print_commande');
        $crud->add_action('Détails', site_url('assets/img/details.gif'), 'Commercial/DetailsCommande');

        $crud->order_by('t_commande.commande_id', 'ASC');

        $output = $crud->render();

        // TEST: juste ce fichier pour avoir accès à des options supplémentaires du "ui.multiselect" (Vérifier la nécessité!?)
        page('Commerce/crud', 'Gestion des Commandes', $output);
        //print_r($output);
    }

    // OK
    function DisabledField($value, $row) {
        return '<input type="text" value="' . $value . '" disabled="disabled">';
    }

    // VOIR SI AUTRE METHODE DE RECUPERATION PLUS SIMPLE ???
    function DisabledCombo($value, $row) {

        include('assets/connexion/connexion.inc.php');

        $queryTab = array();
        $query = 'SELECT t_prod_type.prod_type_libelle FROM t_prod_type WHERE t_prod_type.prod_type_id =' . $value;
        $result = pg_query($query) or die('Query failed: ' . pg_last_error());

        while ($lines = pg_fetch_array($result, null, PGSQL_ASSOC)) {
            array_push($queryTab, $lines);
        }

        pg_free_result($result);
        pg_close($dbconn);

        return '<select style="width:300px"><option selected="selected" disabled="disabled">' . $queryTab[0]['prod_type_libelle'] . '</option></select>';
    }

    // TODO !?
    function DisabledMultiselect($value, $row) {
        // Connexion à la base, renvoit un tableau avec les valeurs en disabled.
    }

    /*     * **************************************************************************************************************************************************** */

    // OK - VOIR COMMENT OPTIMISER...
    public function commande_after_insert($post_array) {

        include('assets/connexion/connexion.inc.php');

        // var_dump(count($post_array['Produits']));

        $ProduitQte = array();
        $tabIds = array();

        // ON RECUPERE L'ID DE LA COMMANDE QUI VIENT D'ETRE CREEE		
        $query = ' SELECT max( t_commande.commande_id ) FROM t_commande';

        $result = pg_query($query) or die('Query failed: ' . pg_last_error());
        $tabIds = pg_fetch_array($result, null, PGSQL_ASSOC);

        // ON RECUPERE TOUTES LES VALEURS QUE L'ON INSERE DANS "COMMANDE_LIGNE"
        for ($i = 0; $i < count($post_array['Produits']); $i++) {

            $query = '
				 SELECT t_produit.produit_quantite_commande,
						t_produit.produit_prix
				   FROM t_produit
				  WHERE t_produit.produit_id =' . $post_array['Produits'][$i];

            $result = pg_query($query) or die('Query failed: ' . pg_last_error());

            while ($lines = pg_fetch_array($result, null, PGSQL_ASSOC)) {

                $data = array('commande_ligne_qte' => $lines['produit_quantite_commande'],
                    'commande_ligne_prix' => $lines['produit_prix']);

                // UPDATE COMMANDE_LIGNE... WHERE... 
                $this->db->where('produit_id', $post_array['Produits'][$i], 'commande_id', $tabIds['max']);
                $this->db->update('a_commande_ligne', $data);

                // ON REMET A ZERO LES QTES DES PRODUITS SELECTIONNES
                $updateProdQte = array('produit_quantite_commande' => 0);
                $this->db->where('produit_id', $post_array['Produits'][$i]);
                $this->db->update('t_produit', $updateProdQte);
            }
        }

        // UPDATE DE COMMANDE AVEC LE HISTO_SOC_ID
        if (empty($post_array['histo_soc_id'])) {

            $tabSociete = array();

            // ON RECUPERE L'ID DE LA SOCIETE		
            $query = '
				SELECT t_societe.societe_id
				FROM t_societe
				LEFT JOIN a_contacter   ON t_societe.societe_id = a_contacter.societe_id
				LEFT JOIN t_utilisateur ON t_utilisateur.utilisateur_id = a_contacter.utilisateur_id
				WHERE a_contacter.utilisateur_id = ' . $post_array['utilisateur_id'];

            $result = pg_query($query) or die('Query failed: ' . pg_last_error());
            $tabSociete = pg_fetch_array($result, null, PGSQL_ASSOC);

            $data = array('histo_soc_id' => $tabSociete['societe_id']);

            // ON UPDATE "T_COMMANDE" AVEC L'ID DE LA SOCIETE
            $this->db->where('commande_id', $tabIds['max']);
            $this->db->update('t_commande', $data);
        }

        pg_free_result($result);
        pg_close($dbconn);

        return $post_array;
    }

    /*     * **************************************************************************************************************************************************** */

    // OK
    function Image_actif($value, $row) {
        if ($value == 't')
            return '<IMG SRC="' . base_url() . 'assets/img/ok.png" ALT="Actif" TITLE="Actif">';
        else if ($value == 'f')
            return '<IMG SRC="' . base_url() . 'assets/img/nok.png" ALT="Non actif" TITLE="Non actif">';
        else
            return '<IMG SRC="' . base_url() . 'assets/img/nok.png" ALT="Non actif" TITLE="Non actif">';
    }

}